hhkb
모의해킹

호스트기반모의해킹_14_웹 취약점 진단(파일 업로드)

작성자 : Heehyeon Yoo|2025-11-26
# 모의해킹# Web# 파일 업로드# Web Shell# MIME Bypass

1. 개요

파일 업로드 기능은 웹 애플리케이션의 필수 기능이지만, 공격자에게 RCE(Remote Code Execution)로 가는 직행 티켓이 되기도 한다. 공격자는 웹 쉘(Web Shell)과 같은 악성 스크립트 파일을 업로드하여 서버를 장악하려 한다.

2. 보안 검증 우회 기법(Bypass Techniques)

개발자는 악성 파일을 막기 위해 검증 로직을 추가하지만, 이를 우회하는 다양한 기법이 존재한다.

2.1 파일 확장자 변조(Extension Bypass)

  • Blacklist 우회: .php만 막았다면 .php5, .phtml, .PhP(대소문자 혼용) 등을 시도한다.
  • 이중 확장자: shell.php.png 같은 형식을 시도할 수 있으나, 웹 서버 설정에 따라 성공 여부가 갈린다.

2.2 콘텐츠 타입 변조(MIME Type Bypass)

  • 원리: 브라우저가 전송하는 Content-Type 헤더를 신뢰할 때 발생.
  • 진단 방법: Burp Suite로 요청을 가로채어 헤더 값을 변경한다.
    • AS-IS: Content-Type: application/x-php
    • TO-BE: Content-Type: image/jpeg

2.3 매직 바이트 변조(Magic Byte Bypass)

  • 원리: 서버가 파일의 실제 헤더(Magic Byte)만 검사하여 파일 종류를 판단할 때 발생.
  • 진단 방법: 악성 PHP 코드 앞에 정상 이미지 파일의 헤더를 붙인다.
    • 예: PNG 헤더(89 50 4E 47 ...) + PHP 코드(<?php system($_GET['cmd']); ?>)
    • 이를 Polyglot File이라고도 한다.

3. 고급 공격 기법: LFI와 연계(Chaining)

완벽하게 방어된 업로드 기능이라도, 단순 이미지 파일 업로드는 허용된다.

  • 시나리오:
    1. 공격자는 PHP 코드가 숨겨진 이미지 파일(Polyglot)을 정상적으로 업로드한다.
      • 서버는 이미지를 검증하고 통과시킨다.
    2. 서버가 해당 이미지를 실행하지는 않는다(그냥 이미지로 서빙됨).
    3. 공격자는 LFI 취약점을 찾아낸다.
    4. LFI를 이용해 업로드한 이미지 파일을 PHP 엔진이 해석하도록 강제한다.
      • vuln.php?page=../../uploads/cat.png
    5. 이미지 내의 PHP 코드가 서버에서 실행된다.

4. 자동화 및 실무 고려사항

4.1 자동화 도구

  • Fuxploider: 파일 업로드 취약점 스캔 도구.
    • 확장자, MIME 타입 등을 자동으로 조합(Permutation)하여 Fuzzing한다.

4.2 실무에서는?

"파일 업로드는 쓰레기를 남긴다."

  1. 스토리지 고갈 주의: 자동화 도구를 무분별하게 돌리면 수백, 수천 개의 쓰레기 파일이 서버에 쌓여 스토리지 고갈(DoS)을 유발할 수 있다.
  2. 사전 협의 필수:
    • "파일 업로드 테스트를 진행해도 되는가?"
    • "테스트 후 생성된 파일은 어떻게 삭제할 것인가?"(파일명 리스트업 필수)
  3. 파일명 관리: 테스트 파일에는 식별 가능한 이름(test_vuln_check_01.php)을 사용하여 추후 삭제가 용이하도록 한다.